package cn.gxljc.technology.store_management.scontroller.logincontroller;

import cn.gxljc.technology.store_management.entity.AccountInfo;
import cn.gxljc.technology.store_management.entity.AccountPermissions;
import cn.gxljc.technology.store_management.entity.Warehouse;
import cn.gxljc.technology.store_management.entity.WarehouseManagement;
import cn.gxljc.technology.store_management.service.loginservice.LoginService;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * 功能：专门用于处理所有有关登录业务的请求
 * 作者：7214
 */
@RestController
@RequestMapping("/Login")
public class LoginController {

    @Resource
    private LoginService loginService;

    /**
     * 功能：处理有关超级管理员登录的请求
     * 输入参数：账号，密码
     * 输出参数：0登录成功，-1登录失败，-2不存在该账号，-3密码不正确，-4没有给账号设置权限，-5不是超级管理员账户
     */
    //http://localhost:8081/Login/loginSuperAdmin?accountID=123&&password=123
    @GetMapping("/loginSuperAdmin")
    public String loginSuperAdmin(HttpServletRequest request) {
        //获取参数
        String accountID = request.getParameter("accountID");
        String password = request.getParameter("password");
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("method", "loginSuperAdmin");
        //非空判断
        if (accountID == null || password == null || accountID.equals("") || password.equals("")) {
            jsonObject.put("result", -1);
            return jsonObject.toJSONString();
        }
        //执行业务逻辑
        Integer integer = null;
        try {
            integer = loginService.loginSuperAdmin(Integer.parseInt(accountID), password);
        } catch (NumberFormatException e) {
            System.out.println("账号类型不正确");
            jsonObject.put("result", -1);
            return jsonObject.toJSONString();
        }
        jsonObject.put("result", integer);
        return jsonObject.toJSONString();
    }

    /**
     * 功能：处理有关仓库管理员登录的请求
     * 输入参数：账号，密码
     * 输出参数：0登录成功，-1登录失败，-2不存在该账号，-3密码不正确，-4没有给账号设置权限，-5不是超级管理员账户
     */
    //http://localhost:8081/Login/loginRepositoryAdmin?accountID=123&&password=123
    @GetMapping("/loginRepositoryAdmin")
    public String loginRepositoryAdmin(HttpServletRequest request) {
        //获取参数
        String accountID = request.getParameter("accountID");
        String password = request.getParameter("password");
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("method", "loginRepositoryAdmin");
        //非空判断
        if (accountID == null || password == null || accountID.equals("") || password.equals("")) {
            jsonObject.put("result", -1);
            return jsonObject.toJSONString();
        }
        //执行业务逻辑
        Integer integer = null;
        try {
            integer = loginService.loginRepositoryAdmin(Integer.parseInt(accountID), password);
        } catch (NumberFormatException e) {
            System.out.println("账号类型不正确");
            jsonObject.put("result", -1);
            return jsonObject.toJSONString();
        }
        jsonObject.put("result", integer);
        return jsonObject.toJSONString();
    }

    /**
     * 功能：处理有关卖家登录的请求
     * 输入参数：账号，密码
     * 输出参数：0登录成功，-1登录失败，-2不存在该账号，-3密码不正确，-4没有给账号设置权限，-5不是超级管理员账户
     */
    //http://localhost:8081/Login/loginCustomer?accountID=123&&password=123
    @RequestMapping("/loginCustomer")
    public String loginCustomer(HttpServletRequest request) {
        //获取参数
        String accountID = request.getParameter("accountID");
        String password = request.getParameter("password");

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("method", "loginCustomer");

        //非空判断
        if (accountID == null || password == null || accountID.equals("") || password.equals("")) {
            jsonObject.put("result", -1);
            return jsonObject.toJSONString();
        }
        //执行业务逻辑

        //判断非法字符
        Integer integer = null;
        try {
            integer = loginService.loginCustomer(Integer.parseInt(accountID), password);
        } catch (NumberFormatException e) {
            System.out.println("账号类型不正确");
            jsonObject.put("result", -1);
            return jsonObject.toJSONString();
        }
        jsonObject.put("result", integer);
        return jsonObject.toJSONString();
    }

    /**
     * 功能：登录并且获取基本信息
     * 请求参数：accountID（用户ID），password（用户密码）
     * 响应参数：result（结果，0登录成功，-1登录失败，-2不存在该账号，-3密码不正确，-4没有给账号设置权限），-5（设置了仓库管理员权限，但是没有分配对应的仓库）
     * user（用户标识符），name（用户名），authority（账户权限），phone（用户电话）
     * email（用户邮箱），repositoryName（仓库名称）
     */
    //http://localhost:8081/Login/loginUser?accountID=123&password=123
    @GetMapping("/loginUser")
    public String loginUser(HttpServletRequest request) {
        System.out.println("----------------------------------------------------------------------------------");
        //获取参数
        String accountID = request.getParameter("accountID");
        String password = request.getParameter("password");
        System.out.println("1");


        //初始化数据
        JSONObject loginJsonObject = new JSONObject();
        HttpSession session = request.getSession();
        System.out.println("2");

        //获取登录检测的返回值
        Integer resultType = loginService.loginUser(accountID, password);
        System.out.println("3:" + resultType);

        //根据不同的类型进行操作
        switch (resultType) {
            case 0:
                System.out.println("4");
                break;
            case -1:
                System.out.println("5");
                loginJsonObject.put("result", -1);
                return loginJsonObject.toJSONString();
            case -2:
                System.out.println("6");
                loginJsonObject.put("result", -2);
                return loginJsonObject.toJSONString();
            case -3:
                System.out.println("7");
                loginJsonObject.put("result", -3);
                return loginJsonObject.toJSONString();
            case -4:
                System.out.println("8");
                loginJsonObject.put("result", -4);
                return loginJsonObject.toJSONString();
        }

        System.out.println("9");
        //获取账号基本信息
        AccountInfo accountInfo = loginService.getAccountInfo(accountID);
        if (accountInfo == null) {
            System.out.println("10");
            loginJsonObject.put("result", -1);
            return loginJsonObject.toJSONString();
        }


        System.out.println("11");
        //获取账号权限
        AccountPermissions accountPermission = loginService.getAccountPermission(accountID);
        if (accountPermission == null) {
            System.out.println("12");
            loginJsonObject.put("result", -1);
            return loginJsonObject.toJSONString();
        }

        System.out.println("13");
        //获取账号类型
        Integer authority = loginService.getAuthority(accountID);
        if (authority == 1) {//如果是仓库管理员那么就进行额外的查询信息
            System.out.println("14");
            //获取账号所管理的仓库
            Warehouse warehouse = loginService.getWarehouse(accountID);
            System.out.println("15");
            if (warehouse == null) {//如果没有数据则直接退出
                System.out.println("16");
                loginJsonObject.put("result", -5);
                return loginJsonObject.toJSONString();
            }
            System.out.println("17");
            //将所有的仓库信息封装起来
            JSONObject warehouseJsonObject = new JSONObject();
            int warehouseID = warehouse.getWarehouseID();
            String warehouseName = warehouse.getWarehouseName();
            String warehouseAddress = warehouse.getWarehouseAddress();

            warehouseJsonObject.put("repositoryID", warehouseID);
            warehouseJsonObject.put("repositoryName", warehouseName);
            warehouseJsonObject.put("repositoryAddress", warehouseAddress);
            //将仓库的JSON数据加入到总的JSON数据中。
            loginJsonObject.put("repository", warehouseJsonObject);

            //将数据存储到Session中
            session.setAttribute("repositoryID", warehouseID);
            session.setAttribute("repositoryName", warehouseName);
            session.setAttribute("repositoryAddress", warehouseAddress);
            System.out.println("18");
        }
        System.out.println("19");
        //将上述的基本数据都加入到总的JSON数据中。
        //将用户信息保存到对应的JSON中。
        JSONObject userInfoJsonObject = new JSONObject();
        userInfoJsonObject.put("username", accountInfo.getAccountName());
        userInfoJsonObject.put("phone", accountInfo.getPhoneNumber());
        userInfoJsonObject.put("email", accountInfo.getEmail());

        System.out.println("20");
        //将用户权限信息保存到对应的JSON中。
        JSONObject authorityJsonObject = new JSONObject();
        authorityJsonObject.put("authorityType", accountPermission.getPermissions());

        loginJsonObject.put("userInfo", userInfoJsonObject);
        loginJsonObject.put("authorityInfo", authorityJsonObject);
        loginJsonObject.put("result", 0);

        System.out.println("21");
        //将所有的数据存储到session中
        session.setAttribute("accountID", accountID);
        session.setAttribute("password", password);
        session.setAttribute("username", accountInfo.getAccountName());
        session.setAttribute("phone", accountInfo.getPhoneNumber());
        session.setAttribute("email", accountInfo.getEmail());
        session.setAttribute("authorityType", accountPermission.getPermissions());

        System.out.println("22");

        return loginJsonObject.toJSONString();
    }




}
